{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://mp.weixin.qq.com/s/XgH10tiYOiQO_emYk0BYdQ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "ename": "ImportError",
     "evalue": "cannot import name 'IndicatorX' from 'indicators.IndicatorX' (d:\\proj\\Python\\x_quant\\indicators\\IndicatorX.py)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mImportError\u001b[0m                               Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[10], line 5\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpyplot\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mplt\u001b[39;00m\n\u001b[0;32m      4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mdatetime\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m datetime\n\u001b[1;32m----> 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mindicators\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mIndicatorX\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m IndicatorX\n",
      "\u001b[1;31mImportError\u001b[0m: cannot import name 'IndicatorX' from 'indicators.IndicatorX' (d:\\proj\\Python\\x_quant\\indicators\\IndicatorX.py)"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from datetime import datetime\n",
    "from indicators.IndicatorX import IndicatorX"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_hist_k_data(code,start_date,end_date,frequency='d')->pd.DataFrame:\n",
    "    \"\"\"\n",
    "    获取历史K线数据\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    import baostock as bs\n",
    "    bs.login()\n",
    "    rs = bs.query_history_k_data_plus(code,\"date,code,open,high,low,close,preclose,volume,amount,pctChg\",start_date,end_date,frequency=frequency)\n",
    "    data_list = []\n",
    "    while (rs.error_code == '0') & rs.next():\n",
    "        # 获取一条记录，将记录合并在一起\n",
    "        data_list.append(rs.get_row_data())\n",
    "    result = pd.DataFrame(data_list, columns=rs.fields)\n",
    "    result.open = result.open.astype(float)\n",
    "    result.high = result.high.astype(float)\n",
    "    result.low = result.low.astype(float)\n",
    "    result.close = result.close.astype(float)\n",
    "    result.date= pd.to_datetime(result.date)\n",
    "    result.set_index('date',inplace=True)\n",
    "    bs.logout()\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "login success!\n",
      "logout success!\n"
     ]
    }
   ],
   "source": [
    "# 获取股票数据\n",
    "stock_symbol = 'sz.000001'\n",
    "start_date = '2005-01-01'\n",
    "end_date = '2023-01-01'\n",
    "data = get_hist_k_data(stock_symbol, start_date, end_date)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算True Range\n",
    "data['TR'] = np.maximum(data['high'], data['close'].shift(1)) - np.minimum(data['low'], data['close'].shift(1))\n",
    "\n",
    "# 计算BP和ATR\n",
    "data['BP'] = data['close'] - data['low']\n",
    "data['ATR'] = data['TR'].rolling(window=7).sum() * 4 + data['TR'].rolling(window=14).sum() * 2 + data['TR'].rolling(window=28).sum()\n",
    "data['ATR'] /= 7\n",
    "\n",
    "# 计算UOS\n",
    "data['UOS'] = (data['BP'] / data['ATR']) * 100\n",
    "\n",
    "# 生成交易信号\n",
    "data['Signal'] = 0\n",
    "data['Position'] = 0\n",
    "\n",
    "data.loc[data['UOS'] > 70, 'Signal'] = -1  # 卖出信号\n",
    "data.loc[data['UOS'] < 30, 'Signal'] = 1   # 买入信号\n",
    "\n",
    "# 计算持仓\n",
    "data['Position'] = data['Signal'].diff()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 回测策略\n",
    "def backtest_strategy(data):\n",
    "    data['Strategy_Returns'] = data['Position'].shift(1) * data['close'].pct_change()\n",
    "    data['Cumulative_Returns'] = (1 + data['Strategy_Returns']).cumprod()\n",
    "    return data\n",
    "\n",
    "data = backtest_strategy(data)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABI0AAAJwCAYAAAAEFJHJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABoqUlEQVR4nO3de3zO9f/H8ee1zQ7M5jRzmmOO0eYcQmqaUBEZHbBKyaEkipLhW+koEqVyKCYkUSrRHIpEOZ+FScmcYnPa8fr8/vDblatrW7u4TnM97rfbbrf2+byvz+f12Xv66vl9v18fk2EYhgAAAAAAAIAr+Li7AAAAAAAAAHgeQiMAAAAAAADYIDQCAAAAAACADUIjAAAAAAAA2CA0AgAAAAAAgA1CIwAAAAAAANggNAIAAAAAAIANQiMAAAAAAADYIDQCAAAAAACADUIjAACA61TVqlXVt29fh16zb9++qlq1qkOvCQAAPBOhEQAAbjR16lSZTCY1b94833FHjhxR//79VbVqVQUEBKhs2bLq0qWL1q1bV+B7nT9/XvHx8apfv76KFSum0qVLKyoqSk899ZT++usvy7hvvvlGY8aMudpHytfFixc1ZswYrV692inXd4bVq1fr3nvvVbly5eTv76+yZcvqrrvu0qJFi9xdmtP89ddfGjNmjLZu3eruUiz69u0rk8lk+QoICFCtWrU0evRopaWlXdU1nfm7DgDA9YDQCAAAN0pISFDVqlW1ceNGHThwINcx69atU4MGDfTpp5+qW7dumjp1qp566int2rVLrVu31uTJk//zPpmZmWrTpo3eeOMNtW7dWhMmTNDzzz+vRo0aae7cudq/f79l7DfffKOxY8c67BmvdPHiRY0dO7bQhEbx8fFq166ddu7cqccff1zvv/++hg8frvPnz6tbt26aO3euu0t0ir/++ktjx47NNTT68MMPtW/fPtcXJSkgIECzZ8/W7NmzNWHCBFWtWlX/+9//9Mgjj1zV9Zz5uw4AwPXAz90FAADgrZKSkvTTTz9p0aJFevzxx5WQkKD4+HirMWfOnFH37t0VFBSkdevWqUaNGpZzQ4cOVUxMjIYMGaLGjRurZcuWed5r8eLF2rJlixISEnT//fdbnUtLS1NGRsZVPUNWVpbMZrP8/f2v6vOebOHChRo3bpy6d++uuXPnqkiRIpZzw4cP13fffafMzEw3VugeV/4cXM3Pz08PPvig5fsBAwaoZcuW+vTTTzVhwgSFh4e7rbYrXbhwQcWKFXN3GQAAXDNWGgEA4CYJCQkqWbKkOnXqpO7duyshIcFmzLRp05ScnKw33njDKjCSpKCgIH388ccymUwaN25cvvc6ePCgJKlVq1Y25wIDAxUSEiLp8hagKVOmSJLVViBJOnz4sEwmk958801NnDhRNWrUUEBAgHbv3q2MjAyNHj1ajRs3VmhoqIoVK6bWrVtr1apVlvscPnxYYWFhkqSxY8darn3l9qC9e/eqe/fuKlWqlAIDA9WkSRN9+eWXNjVv375dbdu2VVBQkCpVqqSXXnpJM2fOlMlk0uHDhyVJffr0UZkyZXINdu644w7Vrl0735/Ziy++qFKlSmnGjBm5BiUxMTHq3LmzJGnWrFlW986xevVqmUwmq5VVt956q+rXr295hqJFi+qGG27QwoULJUlr1qxR8+bNFRQUpNq1a+v777+3umZePYXGjBljmau8/P333xo2bJgaNGig4OBghYSE6M4779S2bdusam7atKkkKS4uzjJPs2bNsrl/ZmamSpUqpbi4OJt7paamKjAwUMOGDbMcS09PV3x8vG644QYFBAQoIiJCzz77rNLT0/OtOy8mk0m33HKLDMPQoUOHrM59++23at26tYoVK6bixYurU6dO2rVrl+V8fr/ruc2b9M+fgZyfRc51goODdfDgQXXs2FHFixfXAw88YLnuoEGDtHjxYtWvX18BAQG68cYbtWzZMqvrnjt3TkOGDLHaftq+fXtt3rz5qn4uAAA4CiuNAABwk4SEBN17773y9/dXr1699N577+mXX36x/Ae7JH311VcKDAxUjx49cr1GtWrVdMstt2jlypW6dOmSgoKCch1XpUoVSdInn3yiUaNG5RkuPP744/rrr7+0YsUKzZ49O9cxM2fOVFpamh577DEFBASoVKlSSk1N1UcffaRevXqpX79+OnfunKZPn66YmBht3LhRUVFRCgsL03vvvacnnnhCXbt21b333itJuummmyRJu3btUqtWrVSxYkWNGDFCxYoV04IFC9SlSxd9/vnn6tq1qyTp6NGjateunUwmk0aOHKlixYrpo48+UkBAgFWdDz30kD755BN99913lnBHkpKTk7Vy5UqbVV1X+u2337R37149/PDDKl68eJ7jrtaZM2fUuXNn9ezZU/fdd5/ee+899ezZUwkJCRoyZIj69++v+++/X2+88Ya6d++uP/74wyF1HDp0SIsXL9Z9992natWq6fjx45o2bZratm2r3bt3q0KFCqpbt67GjRun0aNH67HHHlPr1q0lKdeVbEWKFFHXrl21aNEiTZs2zWrF2eLFi5Wenq6ePXtKksxms+6++26tXbtWjz32mOrWrasdO3bo7bff1v79+7V48eKreqacoK5kyZKWY7Nnz1afPn0UExOj1157TRcvXtR7772nW265RVu2bFHVqlUL9LteUFlZWYqJidEtt9yiN998U0WLFrWcW7t2rRYtWqQBAwaoePHieuedd9StWzcdOXJEpUuXliT1799fCxcu1KBBg1SvXj2dPn1aa9eu1Z49e9SoUaNrqg0AgGtiAAAAl/v1118NScaKFSsMwzAMs9lsVKpUyXjqqaesxpUoUcKIjIzM91pPPvmkIcnYvn17nmMuXrxo1K5d25BkVKlSxejbt68xffp04/jx4zZjBw4caOT2V4SkpCRDkhESEmKcOHHC6lxWVpaRnp5udezMmTNGeHi48fDDD1uOnTx50pBkxMfH21z/9ttvNxo0aGCkpaVZjpnNZqNly5ZGzZo1LccGDx5smEwmY8uWLZZjp0+fNkqVKmVIMpKSkgzDMIzs7GyjUqVKRmxsrNV9JkyYYJhMJuPQoUO2P6j/t2TJEkOS8fbbb+c55kozZ860uneOVatWGZKMVatWWY61bdvWkGTMnTvXcmzv3r2GJMPHx8f4+eefLce/++47Q5Ixc+ZMy7E+ffoYVapUsakhPj7eZt6qVKli9OnTx/J9WlqakZ2dbTUmKSnJCAgIMMaNG2c59ssvv9jcN6/759T41VdfWY3r2LGjUb16dcv3s2fPNnx8fIwff/zRatz7779vSDLWrVtnc69/37dYsWLGyZMnjZMnTxoHDhww3nzzTcNkMhn169c3zGazYRiGce7cOaNEiRJGv379rD6fnJxshIaGWh3P63c9t3kzjH/+DPx7PiQZI0aMsLmOJMPf3984cOCA5di2bdsMScbkyZMtx0JDQ42BAwfm+/wAALgD29MAAHCDhIQEhYeHq127dpIub2OJjY3VvHnzlJ2dbRl37ty5/1xhknM+NTU1zzFBQUHasGGDhg8fLunydqpHHnlE5cuX1+DBg+3aHtStWzfLNrMcvr6+llUmZrNZf//9t7KystSkSZMCbbH5+++/tXLlSvXo0UPnzp3TqVOndOrUKZ0+fVoxMTH67bffdPToUUnSsmXL1KJFC0VFRVk+X6pUKcuWoBw+Pj564IEH9OWXX+rcuXOW4wkJCWrZsqWqVauWZz05P0tnrDKSpODgYMsKHEmqXbu2SpQoobp161q9SS/nn/+99epqBQQEyMfn8l//srOzdfr0aQUHB6t27dpXvRXqtttuU5kyZTR//nzLsTNnzmjFihWKjY21HPvss89Ut25d1alTxzK/p06d0m233SZJVlsZ83LhwgWFhYUpLCxMN9xwg4YNG6ZWrVppyZIlltVzK1as0NmzZ9WrVy+r+/j6+qp58+YFus/VeOKJJ3I9Hh0dbbW19KabblJISIjVnJYoUUIbNmyweoshAACegNAIAAAXy87O1rx589SuXTslJSXpwIEDOnDggJo3b67jx48rMTHRMrZ48eJWgUducs7/V8ARGhqq119/XYcPH9bhw4c1ffp01a5dW++++67+97//Fbj+vMKWjz/+WDfddJMCAwNVunRphYWF6euvv1ZKSsp/XvPAgQMyDEMvvviiJRTI+crZRnbixAlJ0u+//64bbrjB5hq5Hevdu7cuXbqkL774QpK0b98+bdq0SQ899FC+9eT0ePqvn/3VqlSpks0WwdDQUEVERNgcky6HMI5gNpv19ttvq2bNmgoICFCZMmUUFham7du3F2iecuPn56du3bppyZIllvBx0aJFyszMtAqNfvvtN+3atctmfmvVqiXpn/nNT2BgoFasWKEVK1Zo5syZqlu3rk6cOGG1LfO3336TdDnM+ve9li9fXqD72MvPz0+VKlXK9VzlypVtjpUsWdJqTl9//XXt3LlTERERatasmcaMGeOwoBAAgGtBTyMAAFxs5cqVOnbsmObNm6d58+bZnE9ISNAdd9whSapbt662bNmi9PR0m549ObZv364iRYqoZs2aBa6hSpUqevjhh9W1a1dVr15dCQkJeumllwr02dz6Js2ZM0d9+/ZVly5dNHz4cJUtW1a+vr4aP368pQl3fsxmsyRp2LBhiomJyXVMbqHQf6lXr54aN26sOXPmqHfv3pozZ478/f3z7BGVo06dOpKkHTt2FOg+efWIunLV2JV8fX3tOm4YxlXf60qvvPKKXnzxRT388MP63//+p1KlSsnHx0dDhgyxzMHV6Nmzp6ZNm6Zvv/1WXbp00YIFC1SnTh1FRkZaxpjNZjVo0EATJkzI9Rr/Dsxy4+vrq+joaMv3MTExqlOnjh5//HFLw/Sc55g9e7bKlStncw0/v//+66+9P+MrV3DlVnNurpzTHj16qHXr1vriiy+0fPlyvfHGG3rttde0aNEi3Xnnnf9ZLwAAzkJoBACAiyUkJKhs2bKWNzddadGiRfriiy/0/vvvKygoSJ07d9b69ev12WefWb1qPMfhw4f1448/Kjo6Os8m2PkpWbKkatSooZ07d1qO/dcbuHKzcOFCVa9eXYsWLbL6/L+bTed17erVq0u63Fj5ylAgN1WqVNGBAwdsjud2TLq82mjo0KE6duyY5s6dq06dOlk1Tc5NrVq1VLt2bS1ZskSTJk1ScHBwvuNzrnf27Fmr47///nu+n7saJUuWtLlPQe+1cOFCtWvXTtOnT7c6fvbsWZUpU8byvb2/A23atFH58uU1f/58S2P2F154wWpMjRo1tG3bNt1+++1X9TuWm/Lly+vpp5/W2LFj9fPPP+vmm2+2bAUrW7bsf/4u5VWHK+czR/ny5TVgwAANGDBAJ06cUKNGjfTyyy8TGgEA3IrtaQAAuNClS5e0aNEide7cWd27d7f5GjRokM6dO2dZNfH444+rbNmyGj58uM12lbS0NMXFxckwDI0ePTrf+27btk2nTp2yOf77779r9+7dVq+fL1asmCTb/2DOT85qiitXT2zYsEHr16+3GpfzVql/X7ts2bK69dZbNW3aNB07dszm+idPnrT8c0xMjNavX6+tW7dajv39999KSEjItbZevXrJZDLpqaee0qFDh3IN33IzduxYnT59Wo8++qiysrJszi9fvlxLly6VJEtQ8cMPP1jOZ2dn64MPPijQvexRo0YNpaSkaPv27ZZjx44ds2zBy4+vr6/VHEmXew3l9IvKYe/vgI+Pj7p3766vvvpKs2fPVlZWltXWNOnyapqjR4/qww8/tPn8pUuXdOHChQLd698GDx6sokWL6tVXX5V0+fcjJCREr7zyijIzM23GX/m7lNdzVqlSRb6+vlbzKUlTp069qhrzk52dbbM1sGzZsqpQoYJdvcYAAHAGVhoBAOBCOU2Z77777lzP33zzzQoLC1NCQoJiY2NVunRpLVy4UJ06dVKjRo306KOPql69ekpOTtasWbN04MABTZo0KdfXoV9pxYoVio+P1913362bb75ZwcHBOnTokGbMmKH09HSNGTPGMrZx48aSpCeffFIxMTHy9fW1atqcm86dO2vRokXq2rWrOnXqpKSkJL3//vuqV6+ezp8/bxkXFBSkevXqaf78+apVq5ZKlSql+vXrq379+poyZYpuueUWNWjQQP369VP16tV1/PhxrV+/Xn/++ae2bdsmSXr22Wc1Z84ctW/fXoMHD1axYsX00UcfqXLlyvr7779tVo+EhYWpQ4cO+uyzz1SiRAl16tQp32fJERsbqx07dujll1/Wli1b1KtXL1WpUkWnT5/WsmXLlJiYqLlz50qSbrzxRt18880aOXKk/v77b5UqVUrz5s3LNWy6Vj179tRzzz2nrl276sknn7S8Tr5WrVr/2cy6c+fOGjdunOLi4tSyZUvt2LFDCQkJlpVeOWrUqKESJUro/fffV/HixVWsWDE1b9483+bhsbGxmjx5suLj49WgQQPVrVvX6vxDDz2kBQsWqH///lq1apVatWql7Oxs7d27VwsWLNB3332nJk2a2P3zKF26tOLi4jR16lTt2bNHdevW1XvvvaeHHnpIjRo1Us+ePRUWFqYjR47o66+/VqtWrfTuu+9Kyvt3PTQ0VPfdd58mT54sk8mkGjVqaOnSpU7ph3Tu3DlVqlRJ3bt3V2RkpIKDg/X999/rl19+0VtvveXw+wEAYBd3vroNAABvc9dddxmBgYHGhQsX8hzTt29fo0iRIsapU6csx5KSkox+/foZlStXNooUKWKUKVPGuPvuu21eX56XQ4cOGaNHjzZuvvlmo2zZsoafn58RFhZmdOrUyVi5cqXV2KysLGPw4MFGWFiYYTKZLK8kz3nd+BtvvGFzfbPZbLzyyitGlSpVjICAAKNhw4bG0qVLc309/E8//WQ0btzY8Pf3NyQZ8fHxlnMHDx40evfubZQrV84oUqSIUbFiRaNz587GwoULra6xZcsWo3Xr1kZAQIBRqVIlY/z48cY777xjSDKSk5Nt6luwYIEhyXjssccK9PO6UmJionHPPfdY/dzuuusuY8mSJVbjDh48aERHRxsBAQFGeHi48fzzzxsrVqyweXV727ZtjRtvvNHmPlWqVDE6depkc1ySzevYly9fbtSvX9/w9/c3ateubcyZM8eIj4+3eX18lSpVjD59+li+T0tLM5555hmjfPnyRlBQkNGqVStj/fr1Rtu2bY22bdtafXbJkiVGvXr1DD8/P6vXzOc2p4Zx+XcgIiLCkGS89NJLufwkDSMjI8N47bXXjBtvvNEICAgwSpYsaTRu3NgYO3askZKSkutncvTp08coVqxYrucOHjxo+Pr6Wj3rqlWrjJiYGCM0NNQIDAw0atSoYfTt29f49ddfLWPy+l03DMM4efKk0a1bN6No0aJGyZIljccff9zYuXOn1c/iv+rKbe4Mw3pe0tPTjeHDhxuRkZFG8eLFjWLFihmRkZHG1KlT8/15AADgCibD+NcaZQAAgEJoyJAhmjZtms6fP2/TfHjJkiXq0qWLfvjhB7Vu3dpNFQIAABQuhEYAAKDQuXTpklXj79OnT6tWrVpq1KiRVqxYYTO+c+fO2rNnjw4cOOCwJswAAADXO3oaAQCAQqdFixa69dZbVbduXR0/flzTp09XamqqXnzxRatx8+bN0/bt2/X1119r0qRJBEYAAAB2YKURAAAodJ5//nktXLhQf/75p0wmkxo1aqT4+HibV6ybTCYFBwcrNjZW77//vvz8+P/LAAAACorQCAAAAAAAADZ83F0AAAAAAAAAPA+hEQAAAAAAAGywsT8XZrNZf/31l4oXL07DTAAAAAAAcN0wDEPnzp1ThQoV5OOT/1oiQqNc/PXXX4qIiHB3GQAAAAAAAE7xxx9/qFKlSvmOITTKRfHixSVd/gGGhIS4uRoAAAAAAADHSE1NVUREhCX7yA+hUS5ytqSFhIQQGgEAAAAAgOtOQdrx0AgbAAAAAAAANgiNAAAAAAAAYIPQCAAAAAAAADboaQQAAAAAQCFnGIaysrKUnZ3t7lLgZr6+vvLz8ytQz6L/QmgEAAAAAEAhlpGRoWPHjunixYvuLgUeomjRoipfvrz8/f2v6TqERgAAAAAAFFJms1lJSUny9fVVhQoV5O/v75AVJiicDMNQRkaGTp48qaSkJNWsWVM+PlffmYjQCAAAAACAQiojI0Nms1kREREqWrSou8uBBwgKClKRIkX0+++/KyMjQ4GBgVd9LRphAwAAAABQyF3LahJcfxz1+8BvFQAAAAAAAGwQGgEAAAAAAMAGoREAAAAAAABsEBoBAAAAAAC3WL9+vXx9fdWpU6dcz1+6dEnx8fGqVauWAgICVKZMGd13333atWvXf177iy++0M0336zQ0FAVL15cN954o4YMGWI5P2bMGEVFRTnoSaS+ffuqS5cuDrueJyA0AgAAAAAAbjF9+nQNHjxYP/zwg/766y+rc+np6YqOjtaMGTP00ksvaf/+/frmm2+UlZWl5s2b6+eff87zuomJiYqNjVW3bt20ceNGbdq0SS+//LIyMzPtrvFqPnO9IDQCAAAAAOA6YhiGLmZkufzLMAy76jx//rzmz5+vJ554Qp06ddKsWbOszk+cOFHr16/X0qVL1aNHD1WpUkXNmjXT559/rrp16+qRRx7J855fffWVWrVqpeHDh6t27dqqVauWunTpoilTpkiSZs2apbFjx2rbtm0ymUwymUyW+5tMJr333nu6++67VaxYMb388svKzs7WI488omrVqikoKEi1a9fWpEmTLPcbM2aMPv74Yy1ZssRyvdWrV0uS/vjjD/Xo0UMlSpRQqVKldM899+jw4cOWz2ZlZenJJ59UiRIlVLp0aT333HPq06ePZdXSJ598otKlSys9Pd3qGbt06aKHHnrIrp+5vfycenUAAAAAAOBSlzKzVW/0dy6/7+5xMSrqX/CYYcGCBapTp45q166tBx98UEOGDNHIkSNlMpkkSXPnzlX79u0VGRlp9TkfHx89/fTTeuCBB7Rt27Zct5iVK1dOc+fO1c6dO1W/fn2b87Gxsdq5c6eWLVum77//XpIUGhpqOT9mzBi9+uqrmjhxovz8/GQ2m1WpUiV99tlnKl26tH766Sc99thjKl++vHr06KFhw4Zpz549Sk1N1cyZMyVJpUqVUmZmpmJiYtSiRQv9+OOP8vPz00svvaQOHTpo+/bt8vf312uvvaaEhATNnDlTdevW1aRJk7R48WK1a9dOknTffffpySef1Jdffqn77rtPknTixAl9/fXXWr58eYF/3leDlUYAAAAAAMDlpk+frgcffFCS1KFDB6WkpGjNmjWW8/v371fdunVz/WzO8f379+d6fvDgwWratKkaNGigqlWrqmfPnpoxY4ZltU5QUJCCg4Pl5+encuXKqVy5cgoKCrJ8/v7771dcXJyqV6+uypUrq0iRIho7dqyaNGmiatWq6YEHHlBcXJwWLFggSQoODlZQUJACAgIs1/P399f8+fNlNpv10UcfqUGDBqpbt65mzpypI0eOWFYiTZ48WSNHjlTXrl1Vp04dvfvuuypRooSllqCgIN1///2WMEqS5syZo8qVK+vWW2+174duJ1YaAQAAAABwHQkq4qvd42Lcct+C2rdvnzZu3KgvvvhCkuTn56fY2FhNnz7dKgixd8tbjmLFiunrr7/WwYMHtWrVKv3888965plnNGnSJK1fv15FixbN9/NNmjSxOTZlyhTNmDFDR44c0aVLl5SRkfGfjbS3bdumAwcOqHjx4lbH09LSdPDgQaWkpOj48eNq1qyZ5Zyvr68aN24ss9lsOdavXz81bdpUR48eVcWKFTVr1iz17dvXsirLWQiNAAAAAAC4jphMJru2ibnD9OnTlZWVpQoVKliOGYahgIAAvfvuuwoNDVWtWrW0Z8+eXD+fc7xWrVr53qdGjRqqUaOGHn30Ub3wwguqVauW5s+fr7i4uHw/V6xYMavv582bp2HDhumtt95SixYtVLx4cb3xxhvasGFDvtc5f/68GjdurISEBJtzYWFh+X72Sg0bNlRkZKQ++eQT3XHHHdq1a5e+/vrrAn/+arE9DQAAAAAAuExWVpY++eQTvfXWW9q6davla9u2bapQoYI+/fRTSVLPnj31/fffa9u2bVafN5vNevvtt1WvXj2bfkf5qVq1qooWLaoLFy5Ikvz9/ZWdnV2gz65bt04tW7bUgAED1LBhQ91www06ePCg1ZjcrteoUSP99ttvKlu2rG644Qarr9DQUIWGhio8PFy//PKL5TPZ2dnavHmzTQ2PPvqoZs2apZkzZyo6OloREREFfvarRWgEAAAAAABcZunSpTpz5oweeeQR1a9f3+qrW7dumj59uiTp6aefVrNmzXTXXXfps88+05EjR/TLL7+oW7du2rNnj6ZPn57n9qwxY8bo2Wef1erVq5WUlKQtW7bo4YcfVmZmptq3by/pcoiUlJSkrVu36tSpUzZvJ7tSzZo19euvv+q7777T/v379eKLL1oFPTnX2759u/bt26dTp04pMzNTDzzwgMqUKaN77rlHP/74o5KSkrR69Wo9+eST+vPPPyVd7r80fvx4LVmyRPv27dNTTz2lM2fO2Dzb/fffrz///FMffvihHn744av++duD0AgeYfbPv+uJOZuUkWX+78EAAAAAgEJr+vTpio6OtnpbWY5u3brp119/1fbt2xUYGKiVK1eqd+/eev7553XDDTeoQ4cO8vX11c8//6ybb745z3u0bdtWhw4dUu/evVWnTh3deeedSk5O1vLly1W7dm3LvTp06KB27dopLCzMssIpN48//rjuvfdexcbGqnnz5jp9+rQGDBhgNaZfv36qXbu2mjRporCwMK1bt05FixbVDz/8oMqVK+vee+9V3bp19cgjjygtLU0hISGSpOeee069evVS79691aJFCwUHBysmJkaBgYFW1w8NDVW3bt0UHBysLl26FPTHfU1MxtV2lbqOpaamKjQ0VCkpKZZJhHNVHXF5L+br3W5Sj6bOX2IHAAAAANeDtLQ0JSUlqVq1ajYhAwons9msunXrqkePHvrf//5nde7222/XjTfeqHfeeSffa+T3e2FP5uHZnbHgdc6lZ7m7BAAAAAAAXOb333/X8uXL1bZtW6Wnp+vdd99VUlKS7r//fsuYM2fOaPXq1Vq9erWmTp3qstoIjeBRfJz7tkAAAAAAADyKj4+PZs2apWHDhskwDNWvX1/ff/+96tataxnTsGFDnTlzRq+99pple50rEBrBo5AZAQAAAAC8SUREhNatW5fvmMOHD7ummH+hETY8Sl6d7wEAAAAAgGsRGsGjkBkBAAAAgP14xxWu5KjfB0IjeBQyIwAAAAAouCJFikiSLl686OZK4Elyfh9yfj+uFj2N4FHYngYAAAAABefr66sSJUroxIkTkqSiRYvy31VezDAMXbx4USdOnFCJEiXk6+t7TdcjNIJH4d9tAAAAAGCfcuXKSZIlOAJKlChh+b24FoRG8CgmNqgBAAAAgF1MJpPKly+vsmXLKjMz093lwM2KFClyzSuMchAawaOw0ggAAAAAro6vr6/DwgJAohE2PIwPoREAAAAAAB6B0Agehe1pAAAAAAB4BkIjAAAAAAAA2CA0gkehpxEAAAAAAJ6B0AgexURqBAAAAACARyA0gkchMgIAAAAAwDO4NTT64YcfdNddd6lChQoymUxavHjxf35m9erVatSokQICAnTDDTdo1qxZNmOmTJmiqlWrKjAwUM2bN9fGjRsdXzycgoVGAAAAAAB4BreGRhcuXFBkZKSmTJlSoPFJSUnq1KmT2rVrp61bt2rIkCF69NFH9d1331nGzJ8/X0OHDlV8fLw2b96syMhIxcTE6MSJE856DDiQD6kRAAAAAAAewWQYhuHuIqTLvWy++OILdenSJc8xzz33nL7++mvt3LnTcqxnz546e/asli1bJklq3ry5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MGCAzp8/L0lavXq14uLilJKSYlm1NGbMGElSenq6hg0bpooVK6pYsWJq3ry5Vq9e7Z4HBQAAXoHQCAAAwIluu+02RUZGatGiRZIkHx8fvfPOO9q1a5c+/vhjrVy5Us8++6wkqWXLlpo4caJCQkJ07NgxHTt2TMOGDZMkDRo0SOvXr9e8efO0fft23XffferQoYN+++03tz0bAAC4vpkMwzDcXQQAAEBh17dvX509e1aLFy+2OdezZ09t375du3fvtjm3cOFC9e/fX6dOnZJ0uafRkCFDdPbsWcuYI0eOqHr16jpy5IgqVKhgOR4dHa1mzZrplVdecfjzAAAA+Lm7AAAAgOudYRgymUySpO+//17jx4/X3r17lZqaqqysLKWlpenixYsqWrRorp/fsWOHsrOzVatWLavj6enpKl26tNPrBwAA3onQCAAAwMn27NmjatWq6fDhw+rcubOeeOIJvfzyyypVqpTWrl2rRx55RBkZGXmGRufPn5evr682bdokX19fq3PBwcGueAQAAOCFCI0AAACcaOXKldqxY4eefvppbdq0SWazWW+99ZZ8fC63llywYIHVeH9/f2VnZ1sda9iwobKzs3XixAm1bt3aZbUDAADvRmgEAADgIOnp6UpOTlZ2draOHz+uZcuWafz48ercubN69+6tnTt3KjMzU5MnT9Zdd92ldevW6f3337e6RtWqVXX+/HklJiYqMjJSRYsWVa1atfTAAw+od+/eeuutt9SwYUOdPHlSiYmJuummm9SpUyc3PTEAALie8fY0AAAAB1m2bJnKly+vqlWrqkOHDlq1apXeeecdLVmyRL6+voqMjNSECRP02muvqX79+kpISND48eOtrtGyZUv1799fsbGxCgsL0+uvvy5Jmjlzpnr37q1nnnlGtWvXVpcuXfTLL7+ocuXK7nhUAADgBXh7GgAAAAAAAGyw0ggAAAAAAAA2CI0AAAAAAABgg9AIAAAAAAAANgiNAAAAAAAAYIPQCAAAAAAAADYIjQAAAAAAAGCD0AgAAAAAAAA2CI0AAAAAAABgg9AIAAAAAAAANgiNAAAAAAAAYIPQCAAAAAAAADb+DzLTak5aMo/3AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1400x700 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制策略的累计收益\n",
    "plt.figure(figsize=(14, 7))\n",
    "plt.plot(data['Cumulative_Returns'], label='UOS Strategy')\n",
    "plt.title('UOS Strategy Cumulative Returns')\n",
    "plt.xlabel('Date')\n",
    "plt.ylabel('Cumulative Returns')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tf",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
